﻿#pragma warning disable CS8618
using System.Text.Json.Serialization;

namespace zijian666.Updater;

/// <summary>
/// 远程版本数据集合，包含多个版本信息。
/// </summary>
public partial class RemoteData : IReadOnlyCollection<RemoteData.VersionInfo>
{
    /// <summary>
    /// 版本信息列表。
    /// </summary>
    private readonly IList<VersionInfo> _list = [];

    public VersionInfo this[int index] => _list.ElementAtOrDefault(index);

    /// <summary>
    /// 集合中的版本数量。
    /// </summary>
    public int Count => _list.Count;

    /// <summary>
    /// 加载远程数据的时间。
    /// </summary>
    public DateTime? LoadTime { get; protected set;}

    /// <summary>
    /// 表示单个版本的详细信息。
    /// </summary>
    /// <param name="Version">版本号。</param>
    /// <param name="Force">是否强制更新。</param>
    /// <param name="ChangeLog">更新日志。</param>
    /// <param name="EULA">最终用户许可协议。</param>
    /// <param name="Scripts">相关脚本信息。</param>
    public readonly partial record struct VersionInfo(
            Version Version,
            bool Force,
            string ChangeLog,
            string EULA,
            ScriptInfo Scripts
        )
    {
        /// <summary>
        /// 各种更新模式对应的更新信息。
        /// </summary>
        public Dictionary<UpdateMode, UpdateInfo> UpdateInfos { get; init; }
    }

    /// <summary>
    /// 更新信息，包含文件列表和脚本信息。
    /// </summary>
    /// <param name="Files">需要更新的文件列表。</param>
    /// <param name="Scripts">相关脚本信息。</param>
    public readonly record struct UpdateInfo(
        string[] Files,
        ScriptInfo Scripts
        );

    /// <summary>
    /// 脚本信息，包含各阶段的脚本。
    /// </summary>
    /// <param name="PreInstall">安装前脚本。</param>
    /// <param name="Install">安装脚本。</param>
    /// <param name="PostInstall">安装后脚本。</param>
    /// <param name="Check">检查脚本。</param>
    /// <param name="Backup">备份脚本。</param>
    /// <param name="Restore">还原脚本。</param>
    /// <param name="Startup">启动脚本。</param>
    public readonly record struct ScriptInfo(
        string PreInstall,
        string Install,
        string PostInstall,
        string Check,
        string Backup,
        string Restore,
        string Startup
        );

}
